package com.et.util.upload;

import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;

/**
 * 动态读取配置文件类
 */

public class UploadConfigurationRead {
    /**
     * 属性文件全名,需要的时候请重新配置PFILE
     */
    private static String PFILE = "upload.properties";
    
    /**
     * 配置文件路径
     */
    private URI uri = null;

    /**
     * 属性文件所对应的属性对象变量
     */
    private long m_lastModifiedTime = 0;
    
    /**
     * 对应于属性文件的文件对象变量
     */
    private File m_file = null;
    private Properties m_props = null;

    /**
     * 唯一实例
     */
    private static UploadConfigurationRead m_instance = new UploadConfigurationRead();
    
    /**
     * 私有构造函数
     */
    private UploadConfigurationRead() {
       try {
           m_lastModifiedTime = getFile().lastModified();
           if (m_lastModifiedTime == 0) {
              System.err.println(PFILE + "file does not exist!");
           }
           m_props = new Properties();
           m_props.load(new FileInputStream(getFile()));
       } catch (URISyntaxException e) {
           System.err.println(PFILE+"文件路径不正确");
           e.printStackTrace();
       } catch (Exception e) {
           System.err.println(PFILE+"文件读取异常");
           e.printStackTrace();
       }
    }

    /**
     * 查找ClassPath路径获取文件
     * 
     * @return File对象
     */
    private File getFile() throws URISyntaxException {
       URI fileUri = this.getClass().getClassLoader().getResource(PFILE).toURI();
       m_file = new File(fileUri);
       return m_file;
    }

    /**
     * 静态工厂方法
     *
     * @return 返回ConfigurationRead的单一实例
     */
    public synchronized static UploadConfigurationRead getInstance() {
       return m_instance;
    }
    
    /**
     * 读取一特定的属性项
     */
    public String getConfigItem(String name, String defaultVal) {
       long newTime = m_file.lastModified();
       // 检查属性文件是否被修改
       if (newTime == 0) {
           // 属性文件不存在
           if (m_lastModifiedTime == 0) {
              System.err.println(PFILE + " file does not exist!");
           } else {
              System.err.println(PFILE + " file was deleted!!");
           }
           return defaultVal;
       } else if (newTime > m_lastModifiedTime) {
           m_props.clear();
           try {
              m_props.load(new FileInputStream(getFile()));
           } catch (Exception e) {
              System.err.println("文件重新读取异常");
              e.printStackTrace();
           }
       }
       m_lastModifiedTime = newTime;
       String val = m_props.getProperty(name);
       if (val == null) {
           return defaultVal;
       } else {
           return val;
       }
    }
 
    /**
     * 读取一特定的属性项
     *
     * @param name 属性项的项名
     * @return 属性项的值（如此项存在）， 空（如此项不存在）
     */

    public String getConfigItem(String name) {
       return getConfigItem(name, "");
    }
}
